Goroutine 是 Go 其中非常重要的功能之一,既功能強大、容易使用且非常簡潔。
Go 使用 Goroutine 實現並行 (Coroutine) 這件事。其實現方式是在程式語言層級,相比於傳統於作業系統層級實現,耗用的系統資源較少,輕量不少。
使用方式很簡單,只需要在函數前方加上 go
關鍵字,該函數就是使用 Goroutine 執行
package main
import (
"fmt"
"time"
)
func main() {
for i := 0; i < 5; i++ {
go func(i int) {
fmt.Printf("%d ", i)
}(i)
}
// 等待 Goroutine 結束
time.Sleep(1 * time.Second)
}
每個 Goroutine 會是獨立運行的,當有需要傳遞變數時,就會使用到另一個功能通道 (Channel)。
Channel 作為 Goroutine 之間的通訊機制,分別為接收及發送兩項操作。
channel 是一種型別
// 宣告
var ch1 chan int
var ch2 chan bool
var ch3 chan []string
var ch3 chan MyStruct
// 初始化
ch1 = make(chan int, 10) // 有緩衝 channel
ch2 = make(chan bool, 20) // 有緩衝 channel
ch3 = make(chan []string) // 無緩衝 channel
ch4 = make(chan MyStruct, 5) // 有緩衝 channel
無緩衝 channel
package main
import (
"fmt"
"time"
)
func main() {
// 簡單建立,被稱為無緩衝通道
channel := make(chan string)
go func() {
// 模擬耗時操作
time.Sleep(2 * time.Second)
// 發送
channel <- "Hello, Channel!"
}()
// 會造成 deadlock
// channel <- "Again! Hello, Channel!"
// 接收
message := <-channel
fmt.Println(message)
}